package ModelAndController;
/*
Az ÉS kapu hálózati elemet megvalósító osztály. 
A kapu kettő, vagy több bemenetének logikai értékei állnak rendelkezésére, 
melyeken elvégezve az ÉS logikai műveletet, 
az egyetlen kimenetén a belső állapotának megfelelő értéket vesz fel. 
*/
//Exception 80 es 99 kozott
public class AND extends Element{
	//Az ÉS kapu belső állapotát tárolja.
	private int state;
	//konstruktor a belső állapot inicializálásával
	public AND(){
		state = -1;
	}
	//Az elem belső állapotának változását végzi a bemenetek értékének függvényében.
	//Ha az adott elem változott, akkor azt jelzi a visszatérési értéken.
	public boolean isUpdateSuccess(){
		boolean retValue = false;
		if(shouldUpdate){
			retValue = actualUpdate();
			shouldUpdate = false;
		}
		
		buffer = Integer.toString( state );
		return retValue;
	}
	//Kiszámolja,hogy a bemenetek alapján milyen állapotot kell felvennie és 
	//ha az állapota ezzel változik,akkor meghívja a megfelelő függvényt
	private boolean actualUpdate(){
		boolean retValue = false;
		int newState = 1;
		for(int act=0; act<inputWires.length; act++)
			if(inputWires[act].getState() != 1)
				newState = 0;
		
		if( newState != state){
			stateChangeAndNotifyOutputWires(newState);
			retValue = true;
		}

		return retValue;
	}
	//Az elem állapotát állítja be és tájékoztatja a hozzá kapcsolódó huzalokat
	private void stateChangeAndNotifyOutputWires(int newState){
		state = newState;	
		allOutputWiresShouldUpdate();
	}
	//Az elem kimeneteinek számát állítja be
	public void setOutputNumbers(int nbOfOutput) throws Exception{
		if(nbOfOutput != 1)
			throw new Exception("80");
		outputWires = new Wire[nbOfOutput][];
	}
	//Az elem belső állapotának értékét adja vissza.	
	public int getState(int nbOfOutput){
		return state;
	}
}
